3
תגובות
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '127.0.0.1', 100);
socket_listen($socket);
$client = socket_accept($socket);
socket_write($client, 'output');
sleep(10);
socket_close($client);
socket_close($socket);
?>

כשאני כותב בטרמינל "nc localhost 100" (יש לי גישת root כמובן), אני מקבל "output" ישירות.
לעומת זאת, אם אני נכנס בדפדפן ל-"localhost:100", אני מקבל "output" רק אחרי 10 שניות.

אבל, אם אני משנה את הקוד:
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '127.0.0.1', 100);
socket_listen($socket);
$client = socket_accept($socket);
$str = '';
for ($index = 0; $index < 4096; $index++) {
    $str .= ' ';
}
socket_write($client, $str);
socket_write($client, 'output');
sleep(10);
socket_close($client);
socket_close($socket);
?>

אני מקבל "output" ישירות בדפדפן (עם כל הרווחים לפני).

למה זה קורה? ואיך אני יכול לגרום לדפדפן להציג את הטקסט שהוא מקבל ישירות, בלי לשלוח המון רווחים?

3 תשובות

avatar ענה iiddaannyy ב 22 לאוגוסט 2012 #

אוקיי, זה בגלל הדפדפן: http://stackoverflow.com/questions/12065076/browser-doesnt-show-received-socket-data-immediately

avatar ענה mat ב 23 לאוגוסט 2012 #

אתה חייב לסגור את החיבור כדי שהוא יגמור לקבל את המידע. כי עד שהוא לא גומר לקבל הוא לא מציג.
אבל אם אתה שולח הרבה מידע כמו עם הרווחים אז הוא כבר מציג.
תכתוב ככה.

socket_close($client);
sleep(10);
socket_close($socket);


אני לא מבין בשביל מה אתה צריך את הsleep הזה. כי עושה את הבעיה.

avatar ענה iiddaannyy ב 23 לאוגוסט 2012 #

ה-sleep הוא רק להדגמה.
אני צריך חיבור פתוח להרבה זמן שעוברות בו הרבה הודעות. וחשוב שכל הודעה תוצג ישירות בדפדפן.
הדפדפן מתעלם מכמות מידע מסוימת, לכן צריך לשלוח סתם מידע לפני זה.